lpunbfandomcom-20200214-history
Seminário sobre Ruby - 2012/2 - Grupo 2
Ruby é uma linguagem interpretada que busca equilibrar programação funcional e programação imperativa ao mesmo tempo que permite orientação a objetos (multiparadigma), a fim de fornecer uma ferramenta de entendimento simples, mas de profundidade extensa. Programada em C e lançada em 1995 no Japão, vem ganhando popularidade desde então graças a elementos-chave de sua composição, como o visual simples, a sintaxe facilmente compreensível, construção de blocos e descomplicada orientação a objetos. História do Ruby Ruby começou a ser concebida em 1993 por Yukihiro Matsumoto, ou "Matz", visando o equilíbrio perfeito entre os paradigmas funcional e imperativo. Matz queria criar uma linguagem de script "mais poderosa que Perl e mais orientada a objetos que Python", então juntou vários elementos de suas linguagens preferidas para criar sua própria. O nome, diz ele, partiu do fato de o rubi ser a pedra zodiacal de um colega. Ruby passou a se popularizar no Ocidente em 1999, quando surgiu a lista de discussão ruby-talk. Um ano depois, o primeiro livro em inglês sobre a linguagem (Programming Ruby) foi impresso, contribuindo ainda mais para tal. Mas a grande explosão de Ruby veio com o surgimento e rápida adesão ao Ruby On Rails, que consiste num framework para aplicações web baseado em Ruby. A versão estável mais recente da linguagem é a Ruby 1.9.3, mas já existem release candidates para Ruby 2.0 disponíveis, e a versão final deve ser divulgada em breve. Principais Características *Tudo é visto como objeto, inclusive tipos primitivos, possibilitando implementar herança, metaclasses e mixins (combinações de métodos de classes diferentes). *Tipagem dinâmica forte: variáveis não precisam ser declaradas; todas possuem um tipo (classe), mas este pode ser alterado livremente. *Tudo é uma expressão, e tudo é executado de forma imperativa. *Sintaxe sucinta e flexível. *Blocos de código, baseados em Lisp. *Variáveis locais, instanciadas (começando por @) e globais (começando por $). *Biblioteca padrão bastante extensa. *Tratamento de exceções. *Coletor de lixo. *Threading independe do sistema operacional, possibilitando multithreading em qualquer um. *''RubyGems'': gerenciamento e instalação de bibliotecas e programas. *Disponível para todas as grandes plataformas (Windows, Linux, Mac OS). Construção da Linguagem Variáveis Palavras compostas de letras minúsculas em Ruby são variáveis locais. Podem ser compostas de underscores ou números também, mas iniciando-se sempre com letra minúscula. Vale lembrar que não é necessário declarar um tipo para a variável. variavel = 127 variavel_2 = "Oi!" Se uma variável é iniciada por letra maiúscula, ela é compreendida pelo programa como uma constante. Seu valor, depois de declarado, não pode mais ser alterado Constante = "Dura como pedra" Se iniciamos uma variável com o símbolo '$', ela é vista como uma variável global, podendo ser utilizada em qualquer parte do código. $global = "Meu valor será modificado em qualquer lugar." Existem também em Ruby variáveis de instância e de classe, iniciadas por arroba. Elas servem para definir atributos de algum elemento (ou de todos os componentes de uma classe, no segundo caso). @instancia @@classe #Isto é um comentário, iniciando a linha com "#" Strings e Símbolos Strings '''são quaisquer conjuntos de palavras entre aspas ou apóstrofos. string = "Meu carro é vermelho." outra_string = 'Meu outro carro é um Porsche.' Quando se deseja utilizar pequenas strings que não serão impressas em tela, podem ser criados '''símbolos, que se assemelham muito a variáveis, mas são iniciadas com dois-pontos. :simbolo Métodos, Classes e Modules Métodos 'são "ações" aplicáveis a variáveis. São colocados logo após o nome das variáveis, depois de um ponto. Vários métodos podem ser aplicados em sequência. carro.dirigir carro.dirigir.parar.abrir_porta Métodos podem exigir argumentos, que são colocados entre parênteses ao final de sua chamada. carro.dirigir(60, :kmph) O sistema possui métodos que não precisam ser chamados após variáveis, por serem aplicados sobre o próprio ''kernel . O comando puts, por exemplo'','' é um método de'' kernel.'' puts outra_string Métodos normalmente são definidos dentro de classes. Classes definem um conjunto de diferentes objetos com métodos semelhantes que podem ser aplicados sobre eles. class Carro def dirigir(vel,medida) @vel = vel @medida = medida end end carro = Carro.new carro.dirigir(60, :kmph) No exemplo acima, a classe Carro foi criada. Em seguida, um carro foi iniciado e o método dirigir (criado na classe) foi aplicado sobre ele, ou seja, ele passou a ter velocidade de 60, medida em "kmph". O conceito de '''herança '''pode ser aplicado sobre classes. Uma classe pode "herdar" métodos de outra através do símbolo "<" em sua declaração. Ruby não suporta herança múltipla, mas esta pode ser simulada por meio de '''Mixins. Dentro de uma classe, faz-se chamada a um module, que é como uma "classe de classes". Uma observação interessante sobre modules é que eles permitem definições de namespace, ou seja, estabelecem um contexto para aquele módulo e para as classes que o incluem. class Ferrari < Carro #herda de Carro include Italiano #mixin end module Italiano class Algum def metodo ... end end end Vale constar que, em Ruby, classes podem ser livremente modificadas. Mesmo após a construção de uma classe, pode-se abrir novamente a definição da classe e escrever um novo método. Isso vale inclusive para métodos e classes do sistema! Só se faz necessário cuidado para não sobrescrever métodos existentes, ou causar conflitos com outros eventuais. Coleções Ruby possui arrays '''(vetores) em sua constituição. Funcionam da mesma maneira que em outras linguagens, alocando dados para um mesmo elemento. Porém em Ruby, não é necessário que todos os elementos de um array tenham o mesmo tipo, podendo inclusive haver vetores dentro de vetores. um_vetor = 5, 6.5, "Oito", [9,10] E para acessar qualquer parte desse vetor: puts um_vetor2 #imprime "5" Existem também "arrays associativos", chamados de '''hashes. Funcionam como pequenos dicionários, fornecendo definições a símbolos escolhidos. um_hash = {:vermelho => 'pare', :amarelo => 'atenção', verde => 'siga'} puts um_hash:verde #imprime "siga" Vários métodos podem ser definidos e aplicados especificamente para arrays e hashes, como separar elementos iguais, colocar em ordem crescente, apagar elementos específicos, entre outros. Blocos 'Blocos '''são trechos de código fechados dentro de chaves ou entre ''do '' e ''end. Normalmente são passados como parâmetros para métodos. Blocos podem possuir argumentos, que são definidos entre barras verticais. Exemplo de aplicação: # Usa uma variável de instância para passar um bloco. def passar(&um_bloco) @bloco = um_bloco end # Chama o método definido, Passando para ele um bloco com uma cor. passar {|cor| puts "Meu carro é #{cor}!"} # Faz-se a chamada @bloco.call("azul") #saída => "Meu carro é azul!" Outro exemplo, iterando um array: array = 231, 'alguma coisa' array.each do |item| puts item end # => 'nada' # => 231 # => 'alguma coisa' Tratamento de Erros Um levantamento de exceção em Ruby é feito pelo método raise. De tal método, pode-se especificar também uma mensagem de erro a adicionar, bem como um tipo espeífico de exceção a ser usado. raise ArgumentError, "Argumento inválido!" Para tratamento de erros, utiliza-se o método rescue, que captura exceções que herdam de StandardError. O rescue pode trabalhar em conjunto com begin, else e ensure. begin # Faz algo com possibilidade de cair em erro rescue Exception # Trata algum erro possivelmente encontrado else # Segue se nenhum erro for encontrado ensure # Parte realizada independente de haver ou não erro end Critérios de Avaliação da Linguagem Legibilidade Ruby possui uma sintaxe extremamente simples e de fácil entendimento, mas sem que isso prejudique a estrutura da linguagem. Os tipos das variáveis não precisam ser definidos e são facilmente modificáveis. A linguagem é case-sensitive (diferencia maiúsculas de minúsculas), possuindo palavras especiais e identificadores de tamanhos variados (vale observar que todos são vistos como objetos). Sua ortogonalidade é elevada, e instruções de controle são escassas. Todos esses fatores contribuem positivamente para a legibilidade de Ruby. Capacidade de Escrita Tal qual no critério de Legibilidade, a simplicidade, ortogonalidade e sintaxe simples de Ruby contribuem positivamente para a sua redigibilidade. Como tudo é visto como um objeto, a abstração de dados é universalmente presente, e a abstração de processo é bem evidente no uso de blocos. A expressividade de Ruby é evidente, tal qual sua simplicidade: diversos processos podem ser escritos de formas diversas e convenientes. Confiabilidade Ruby é uma linguagem interpretada, e por isso é naturalmente mais lenta do que outras linguagens com orientação a objetos que são compiladas. E devido à sua tipagem dinâmica, não existe verificação de tipos de variáveis nem mesmo em tempo de execução, o que pode acarretar em erros de difícil detecção. Também existe o problema de múltiplas referências e modificações a variáveis, que são todas passadas por valor a outros métodos, também incitando erros possíveis por falta de atenção. Apesar de tudo, existe tratamento de exceções, levantadas com o método raise e tratadas com'' rescue''. Legibilidade e capacidade de escrita aumentadas também contribuem para a confiabilidade de Ruby, Custo Tendo Ruby tamanha simplicidade, o treinamento para qualquer programador, com qualquer experiência, é mínimo. Ruby possui uma vasta documentação para consulta, e muitas vezes é tão simples que nem mesmo é necessária. A similaridade da linguagem com diversas outras é notável. Programadores de Python teriam alguma dificuldade em aplicar os conceitos da linguagem, visto que as filosofias de design de Ruby e Python diferem bastante, mas mesmo nesse caso existem semelhanças, considerando o conceito multiparadigma de Ruby. O custo de escrita de um programa também é bastante reduzido, pelo mesmo fator. O fator que pesa mais em custo para Ruby é o tempo de execução do programa, que como supracitado, é elevado devido ao fato de ser uma linguagem interpretada. Mesmo assim, contrabalanceando com o custo de aprendizado, escrita e manutenção, e levando em conta as aplicações práticas de Ruby, seu custo no geral é bastante reduzido. Portabilidade Programas orientados a objetos, com classes e métodos definidos, normalmente têm uma portabilidade elevada. Ruby não é exceção. Contando com a possibilidade de implementação de herança, métodos de Ruby podem ser aplicados em inúmeras aplicações, e inclusive são compartilhadas por seus criadores via RubyGems. Vale lembrar que Ruby funciona em todos os grandes sistemas operacionais sem necessitar de modificações, tendo também implementações em subsistemas como .NET e Java. Generalidade Ruby é implementável a uma faixa bastante extensa de aplicações, bem como boa parte das linguagens orientadas a objetos. Seu uso mais popular é no desenvolvimento de aplicações web como o Ruby on Rails, voltado a orientação a bancos de dados, mas Ruby pode ser usada em muitos grandes campos, desde que não exijam processamento imediato de informações. Aplicações de desktop, scripting e até mesmo computação científica podem tomar Ruby como base. Qualidade da Definição A documentação de Ruby é bastante extensa e compreensiva. Suas diretivas e definições estão bem especificadas, e podem ser compreendidas facilmente por todos que experimentam a linguagem. Grupo Ciro Viana - 09/0137531 Guilherme Ferreira Peres - 12/0072840 Pedro Leal - 10/0019226 Referências http://www.ruby-lang.org/pt/ - site oficial em português da linguagem Ruby http://mislav.uniqpath.com/poignant-guide/ - site do livro "Why's (Poignant) Guide to Ruby", uma abordagem divertida e eficiente de aprendizado da linguagem http://en.wikipedia.org/wiki/Ruby_(programming_language) - artigo do Wikipedia sobre Ruby Category:Ruby